上一节,我带你了解了链路追踪中的关键功能,链路分析,以及它在 Skywalking 中的原理和实践。在这一节,我将带你了解云观测。
随着用户流量、业务系统的复杂化,单一的服务器已经无法再满足我们的业务需求。机器数量越来越多,传统的自建服务器很难做到良好的维护,从而便衍生出了云服务器的概念。
云服务器利用云服务商提供的云主机替代了原先公司自建的主机,减少了公司购买主机、维护主机的成本。同时,云服务商还可以利用自己的研发能力,提供一套属于自己的基础组件,简化运维人员在运维基础组件时的成本、研发也无需再关心技术选型,只需要使用这个组件,让研发真正做到了只关心业务。
基于这些原因,目前已经有很多公司把自己的服务搬到云上运行。
但是随之而来有一个问题,如何在云上进行监控呢?现在很多云厂商对应自己的组件,都有一套自己的可观测方案,无论是哪一种方案,都能起到端到端观测、全栈性能监控、方案统一、统一观测这 4 个作用。
阿里云提供的 ARMS 就是包含上述功能的一套云观测系统,除了以上 4 点,它还提供了很多特有的功能,让你更方便地观测数据。
ARMS 提供的功能主要分为 6 个部分:前端监控、App 监控、应用监控、自定义监控、大盘展示、报警。我们依次来看。
前端监控 前端监控指的是通过在页面中埋入脚本的形式,让阿里云接管前端的数据上报。其中就包含我们比较常见的脚本错误次数、接口请求次数、PV、UV 等统计数据,也包含页面中脚本错误、API 访问等数据信息。通过统计数据你能快速了解前端用户的访问情况;脚本错误、API 访问等数据,则可以帮助你了解页面出现错误或者接口访问时的详细信息。
App 监控 App 监控的接入方式与前端监控方式类似,都是通过增加相关 SDK 的方式添加监控。其中主要包含崩溃、性能分析和远程日志获取。
应用监控 ARMS 的应用监控和我之前讲的链路追踪的内容十分相似,其中就包含链路数据查询,与业务系统的日志结合,统计指标、拓扑图等信息。阿里云的应用监控还提供了根据参数查询链路的功能,可以在链路中增加业务属性,让你在查询问题链路时更加个性化。
将链路追踪放到云平台的有一个好处,那就是它可以和内部系统做完整的集成,比如结合阿里云提供的全生态组件,查看相互之间的全链路。
自定义监控 自定义监控提供多种场景的数据内容的自定义解析、数据清洗、聚合、保存到统计指标中,进行监控告警。
一般数据源都是通过日志的方式输入,我们可以根据日志中统一的规定,比如限定具体用户 ID 字段的解析位置,去计算异常次数、访问次数等数据。这样的方式可以方便你进行业务层的数据分析,与业务结合起来可以让你不再局限于技术层面去思考问题。
大盘展示 根据指标数据内容定制显示大盘数据。通过定制化的方式,你可以将系统中已有的统计指标内容,通过定制化的图表展示。
你可以能够通过页面的方式,快速了解关心的业务的实时情况。阿里巴巴“双十一”时的交易额页面上会显示实时的交易额,也会显示一些国内外的主要指标数据,这个就是大盘展示最典型的应用场景。
报警 与我在“模块二”中讲到的创建规则与告警十分相似。阿里云 ARMS 所提供的告警功能,会提供一个界面,让你十分方便地通过这个界面去集成各个端中的数据和所有统计指标。同时,它也支持短信、钉钉、邮件等通知方式。
端到端监控 下面,我们依次来看一下如何在 ARMS 上实践上面说到的前端监控、APP 监控和应用监控。
前端监控 如上文所说,前端监控是通过在代码中增加脚本的方式来实现数据监控的。代码如下:
!(function(c,b,d,a){c[a]||(c[a]={});c[a].config={pid:"xx",AppType:"web",imgUrl:"https://arms-retcode.aliyuncs.com/r.png?",sendResource:true,enableLinkTrace:true,behavior:true};
with(b)with(body)with(insertBefore(createElement("script"),firstChild))setAttribute("crossorigin","",src=d)
})(window,document,"https://retcode.alicdn.com/retcode/bl.js","__bl");
在页面中,通过 script 标签引入一个 JavaScript 文件来进行任务处理,然后通过 pid 参数设定的应用 ID,保证数据只会上传到你的服务中。
网页运行时就会自动下载 bl.js 文件,下载完成后,代码会自动执行。当页面处理各种事件时,会通过异步的形式,上报当前的事件信息,从而实现对前端运行环境、执行情况的监控。常见的事件有:页面启动加载、页面加载完成、用户操作行为、页面执行时出现错误、离开页面。
页面加载完成之后,会发送 HEAD 请求来上报数据。其中我们可以清楚的看到,在请求参数中包含 DNS、TCP、SSL、DOM、LOAD 等信息,分别代表 DNS 寻找、TCP 建立连接、SSL 握手这类,我在“05 | 监控指标:如何通过分析数据快速定位系统隐患?(上)”中讲到的通用指标,也包含 DOM 元素加载时间这类网页中的统计指标信息。如下所示:
数据上报后,ARMS 就会接收到相对应事件中的完整数据信息,从而通过聚合的方式,存储和展示数据。在 ARMS 中,针对应用有访问速度、JS 错误、API 请求这些统计指标和错误信息的数据,ARMS 可以依据不同维度的数据了解到更详细的内容,包含页面、地理、终端、网络这 4 类。通过不同的数据维度,你也可以更有针对性地了解问题。
App 监控 App 的监控方式与前端监控十分类似,都需要通过增加代码的方式进行。以 iOS 为例,如果我们想要接入性能分析功能,除了要引入相关依赖,还需要在代码中进行如下的声明:
[[AlicloudAPMProvider alloc] autoInitWithAppVersion:AppVersion channel:channel nick:nick];
[AlicloudHAProvider start];
这段代码会创建 AlicloudAPMProvider 对象,并且传入相关的参数,然后通过 start 方法启动监控功能。
应用监控 对于服务端监控来说,ARMS 支持目前主流的 Java、PHP、Go 等语言,这里我以 Java 语言为例说明。
在 Java 中,主要通过字节码增强的形式采集数据。项目启动后,会采集机器中 JVM 中的统计指标、链路数据等信息,然后结合链路,分析出统计指标、拓扑图的信息,以及应用与各个组件之间的交互细节,比如数据库查询、消息 MQ 发送量等数据信息。
在服务端监控中,我们可以看到请求链路中的数据,在 ARMS 的显示中都是基于应用的维度,以树形进行展示的。比如我们有 2 个应用程序,上游服务通过“/first”接口地址对外提供服务,同时又调用了下游服务的“/second”接口。如下图所示:
这张图中展示了对应的上下游服务、发生时间、实例地址、调用方式、服务名称和时间轴信息。并且我们可以通过点击其中单个服务的“方法栈”按钮,查看其链路中关键方法的执行流程。点开之后的页面如下:
在 ARMS 中服务端监控的功能中,最常用的是应用诊断部分,其中包含了实时诊断、异常分析、线程分析这 3 部分重点功能。
下图中汇总了服务中出现错误的异常信息,我们可以通过点击具体的接口名称,找到对应的接口,更细致地查看接口细则。
如果程序出现执行缓慢的情况,我们可以通过 CPU 资源消耗来寻找原因。还可以通过点击每个线程中右侧的方法栈,来快速查看指定线程的执行方法栈信息。查询到问题的原因后,我们再结合具体的业务场景处理问题。
以上,我介绍了云端观测的作用以及在阿里云的 ARMS 系统中的实践。如果你的系统部署在云端,那么云端观测就是你进行系统观测的不二选择。你通过云端观测解决过哪些问题呢?欢迎你在留言区分享。
下一节,我将带你了解如何将可观测系统与 OSS 系统相结合。